package com.atguigu.spring.bean;


import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;


//@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
//容器就应该给Cat再创建一个对象
@Component
public class Cat implements InitializingBean, SmartInitializingSingleton {

	public Cat(){
		System.out.println("cat被创建了...");
	}

	private String name;


	@Value("${JAVA_HOME}") //自动赋值功能
	public void setName(String name) {
		System.out.println("cat....setName正在赋值调用....");
		this.name = name;
	}
	//注解怎么定义这个是初始化方法？
	public String getName() {
		return name;
	}

	/**
	 * InitializingBean 接口的实现方法，该方法会在Cat初始化完成后执行
	 * 初始化完成是指调用容器刷新12大步之11步中的 org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization(org.springframework.beans.factory.config.ConfigurableListableBeanFactory)方法
	 * 中的 {@link AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)}
	 * @throws Exception
	 */
	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("CatInitializingBean..afterPropertiesSet...");
	}

	/**
	 * 该方法是 接口的实现方法，会在所有的bean都完成初始化后 调用的
	 * {@link  DefaultListableBeanFactory#preInstantiateSingletons()} 中的第二个for循环 （第一个for循环是通过getBean创建完了所有的bean组建）
	 */
	@Override
	public void afterSingletonsInstantiated() {
		System.out.println("所有组件都创建完成以后，再来执行这个方法.....");
	}
}
